#ifndef __BACKUP_FILES_RESTORER_H__
#define __BACKUP_FILES_RESTORER_H__

#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/udp.hpp>

#include "LogWriter.h"


/**
 * Service de surveillance d'une socket, pouvant recevoir des requetes de restauration
 * de fichiers, c'est-a-dire une requete d'une application pour recuperer tous les fragments
 * de fichiers lui appartenant depuis cette machine.
 *
 * @author Benoit FLEURY
 */
class BackupFilesRestorer
{
public:

	BackupFilesRestorer(const LogWriter& logWriter, unsigned short commPort);

	/** Definir le repertoire de stockage. */
	void set_storage_directory(const std::string& storageDirPath);

	/** Lancer ce receveur. */
	void run();

private:
	
	struct SegmentFileName;

	/** Ecriveur de log. */
	const LogWriter& m_logWriter;
	/** Repertoire dans lequel sauver les fragments de fichiers recus. */
	std::string m_storageDirPath;
	/** Service d'entree-sortie pour la socket d'ecoute. */
	boost::asio::io_service m_ioService;
	/** Socket recevant les fragments de fichiers. */
	boost::asio::ip::udp::socket m_socket;

	/**
	 * Gerer la reception d'un message.
	 *
	 * @param buffer Buffer contenant les donnees recues.
	 * @param msgSize Taille des donnees.
	 * @param senderEndpoint Coordonnees de l'emetteur auquel repondre.
	 */
	void handle_reception(const char* buffer, std::size_t msgSize,
		const boost::asio::ip::udp::endpoint& senderEndpoint);
	/**
	 * Envoyer le fichier representant un segment de fiche au chemin donne vers
	 * le recepteur donne.
	 *
	 * @param filePath Chemin du fichier.
	 * @param fileNameInfo Information contenue dans le nom de fichier.
	 * @param destEndpoint Coordonnees du destinataire.
	 */
	void send_segment_file(const boost::filesystem::path& filePath,
		const SegmentFileName& fileNameInfo,
		const boost::asio::ip::udp::endpoint& destEndpoint);
};


#endif // __BACKUP_FILES_RECEIVER_H__
